@@ -4,7 +4,11 @@ import fs from 'node:fs';
44import os from 'node:os' ;
55import path from 'node:path' ;
66import { SessionStore } from '../session-store.ts' ;
7- import { resolveEffectiveSessionName } from '../session-routing.ts' ;
7+ import {
8+ resolveEffectiveSessionName ,
9+ resolveImplicitSessionScope ,
10+ sessionMatchesScope ,
11+ } from '../session-routing.ts' ;
812import type { SessionState } from '../types.ts' ;
913
1014function makeSession ( name : string ) : SessionState {
@@ -30,9 +34,13 @@ function makeStore(t: TestContext): SessionStore {
3034 return new SessionStore ( path . join ( root , 'sessions' ) ) ;
3135}
3236
33- test ( 'reuses lone active session for implicit default session' , ( t ) => {
37+ test ( 'does not reuse lone active session for implicit default session from another scope ' , ( t ) => {
3438 const store = makeStore ( t ) ;
3539 store . set ( 'android' , makeSession ( 'android' ) ) ;
40+ const cwd = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , 'agent-device-cwd-scope-' ) ) ;
41+ t . onTestFinished ( ( ) => {
42+ fs . rmSync ( cwd , { recursive : true , force : true } ) ;
43+ } ) ;
3644
3745 const resolved = resolveEffectiveSessionName (
3846 {
@@ -41,9 +49,98 @@ test('reuses lone active session for implicit default session', (t) => {
4149 command : 'open' ,
4250 positionals : [ 'com.google.android.apps.maps' ] ,
4351 flags : { } ,
52+ meta : { cwd } ,
53+ } ,
54+ store ,
55+ ) ;
56+
57+ assert . match ( resolved , / ^ c w d : [ a - f 0 - 9 ] { 16 } : d e f a u l t $ / ) ;
58+ assert . notEqual ( resolved , 'android' ) ;
59+ } ) ;
60+
61+ test ( 'uses git worktree root for implicit default session scope' , ( t ) => {
62+ const root = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , 'agent-device-cwd-scope-' ) ) ;
63+ const nested = path . join ( root , 'packages' , 'app' ) ;
64+ fs . mkdirSync ( path . join ( root , '.git' ) ) ;
65+ fs . mkdirSync ( nested , { recursive : true } ) ;
66+ t . onTestFinished ( ( ) => {
67+ fs . rmSync ( root , { recursive : true , force : true } ) ;
68+ } ) ;
69+
70+ const store = makeStore ( t ) ;
71+ const fromRoot = resolveEffectiveSessionName (
72+ {
73+ token : 't' ,
74+ session : 'default' ,
75+ command : 'snapshot' ,
76+ positionals : [ ] ,
77+ flags : { } ,
78+ meta : { cwd : root } ,
79+ } ,
80+ store ,
81+ ) ;
82+ const fromNested = resolveEffectiveSessionName (
83+ {
84+ token : 't' ,
85+ session : 'default' ,
86+ command : 'snapshot' ,
87+ positionals : [ ] ,
88+ flags : { } ,
89+ meta : { cwd : nested } ,
4490 } ,
4591 store ,
4692 ) ;
4793
48- assert . equal ( resolved , 'android' ) ;
94+ assert . equal ( fromNested , fromRoot ) ;
95+ } ) ;
96+
97+ test ( 'keeps explicitly configured default session global' , ( t ) => {
98+ const store = makeStore ( t ) ;
99+ const cwd = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , 'agent-device-cwd-scope-' ) ) ;
100+ t . onTestFinished ( ( ) => {
101+ fs . rmSync ( cwd , { recursive : true , force : true } ) ;
102+ } ) ;
103+
104+ const resolved = resolveEffectiveSessionName (
105+ {
106+ token : 't' ,
107+ session : 'default' ,
108+ command : 'snapshot' ,
109+ positionals : [ ] ,
110+ flags : { } ,
111+ meta : { cwd, sessionExplicit : true } ,
112+ } ,
113+ store ,
114+ ) ;
115+
116+ assert . equal ( resolved , 'default' ) ;
117+ } ) ;
118+
119+ test ( 'matches sessions only within the same implicit scope' , ( t ) => {
120+ const cwd = fs . mkdtempSync ( path . join ( os . tmpdir ( ) , 'agent-device-cwd-scope-' ) ) ;
121+ t . onTestFinished ( ( ) => {
122+ fs . rmSync ( cwd , { recursive : true , force : true } ) ;
123+ } ) ;
124+ const req = {
125+ token : 't' ,
126+ session : 'default' ,
127+ command : 'session_list' ,
128+ positionals : [ ] ,
129+ flags : { } ,
130+ meta : { cwd } ,
131+ } ;
132+ const scope = resolveImplicitSessionScope ( req ) ;
133+ assert . ok ( scope ) ;
134+
135+ assert . equal (
136+ sessionMatchesScope ( { ...makeSession ( 'default' ) , sessionScope : scope } , scope ) ,
137+ true ,
138+ ) ;
139+ assert . equal (
140+ sessionMatchesScope (
141+ { ...makeSession ( 'default' ) , sessionScope : { kind : 'cwd' , id : 'other' } } ,
142+ scope ,
143+ ) ,
144+ false ,
145+ ) ;
49146} ) ;
0 commit comments