@@ -258,4 +258,35 @@ describe('createSessionAwareTool', () => {
258258 expect ( parsed . simulatorId ) . toBe ( 'SIM-123' ) ;
259259 expect ( parsed . simulatorName ) . toBeUndefined ( ) ;
260260 } ) ;
261+
262+ it ( 'deep-merges env so user-provided env vars are additive with session defaults' , async ( ) => {
263+ const envSchema = z . object ( {
264+ scheme : z . string ( ) ,
265+ projectPath : z . string ( ) . optional ( ) ,
266+ env : z . record ( z . string ( ) , z . string ( ) ) . optional ( ) ,
267+ } ) ;
268+
269+ const envHandler = createSessionAwareTool < z . infer < typeof envSchema > > ( {
270+ internalSchema : envSchema ,
271+ logicFunction : async ( params ) => ( {
272+ content : [ { type : 'text' , text : JSON . stringify ( params . env ) } ] ,
273+ isError : false ,
274+ } ) ,
275+ getExecutor : ( ) => createMockExecutor ( { success : true } ) ,
276+ requirements : [ { allOf : [ 'scheme' ] } ] ,
277+ } ) ;
278+
279+ sessionStore . setDefaults ( {
280+ scheme : 'App' ,
281+ projectPath : '/a.xcodeproj' ,
282+ env : { API_KEY : 'abc123' , VERBOSE : '1' } ,
283+ } ) ;
284+
285+ // User provides additional env var; session default env vars should be preserved
286+ const result = await envHandler ( { env : { DEBUG : 'true' , VERBOSE : '0' } } ) ;
287+ expect ( result . isError ) . toBe ( false ) ;
288+
289+ const parsed = JSON . parse ( result . content [ 0 ] . text ) ;
290+ expect ( parsed ) . toEqual ( { API_KEY : 'abc123' , DEBUG : 'true' , VERBOSE : '0' } ) ;
291+ } ) ;
261292} ) ;
0 commit comments