@@ -194,7 +194,7 @@ describe("full createSession API", () => {
194194 events . push ( event ) ;
195195 } ) ;
196196
197- const response = await vm . prompt (
197+ const { response } = await vm . prompt (
198198 sessionId ,
199199 "Reply with exactly the word hello." ,
200200 ) ;
@@ -221,7 +221,7 @@ describe("full createSession API", () => {
221221 events . push ( event ) ;
222222 } ) ;
223223
224- const response = await vm . prompt ( sessionId , "test prompt" ) ;
224+ const { response } = await vm . prompt ( sessionId , "test prompt" ) ;
225225
226226 expect ( response . error ) . toBeUndefined ( ) ;
227227 expect ( response . result ) . toBeDefined ( ) ;
@@ -258,6 +258,64 @@ describe("full createSession API", () => {
258258 ) . rejects . toThrow ( ) ;
259259 } , 30_000 ) ;
260260
261+ test ( "VM subprocess spawning works alongside a pi session" , async ( ) => {
262+ const { sessionId } = await vm . createSession ( "pi" , {
263+ env : {
264+ ANTHROPIC_API_KEY : "mock-key" ,
265+ ANTHROPIC_BASE_URL : mockUrl ,
266+ } ,
267+ } ) ;
268+
269+ // Spawn a node subprocess that writes a file
270+ await vm . writeFile (
271+ "/tmp/write-script.js" ,
272+ "require('fs').writeFileSync('/tmp/spawn-test.txt', 'spawned-ok')" ,
273+ ) ;
274+ const proc = vm . kernel . spawn ( "node" , [ "/tmp/write-script.js" ] , {
275+ env : { HOME : "/home/user" } ,
276+ } ) ;
277+ const result = await proc . wait ( ) ;
278+
279+ // Verify the file was written
280+ const content = await vm . readFile ( "/tmp/spawn-test.txt" ) ;
281+ expect ( new TextDecoder ( ) . decode ( content ) ) . toBe ( "spawned-ok" ) ;
282+
283+ // Session still works after subprocess
284+ const { response } = await vm . prompt ( sessionId , "hello" ) ;
285+ expect ( response . error ) . toBeUndefined ( ) ;
286+
287+ vm . closeSession ( sessionId ) ;
288+ } , 90_000 ) ;
289+
290+ test ( "VM filesystem operations work alongside a pi session" , async ( ) => {
291+ const { sessionId } = await vm . createSession ( "pi" , {
292+ env : {
293+ ANTHROPIC_API_KEY : "mock-key" ,
294+ ANTHROPIC_BASE_URL : mockUrl ,
295+ } ,
296+ } ) ;
297+
298+ // mkdir recursive
299+ await vm . mkdir ( "/home/user/project/src" , { recursive : true } ) ;
300+ expect ( await vm . exists ( "/home/user/project/src" ) ) . toBe ( true ) ;
301+
302+ // Write, read, verify
303+ await vm . writeFile ( "/home/user/project/src/index.ts" , "console.log('hello')" ) ;
304+ const content = await vm . readFile ( "/home/user/project/src/index.ts" ) ;
305+ expect ( new TextDecoder ( ) . decode ( content ) ) . toBe ( "console.log('hello')" ) ;
306+
307+ // readdir
308+ const entries = ( await vm . readdir ( "/home/user/project/src" ) )
309+ . filter ( ( e ) => e !== "." && e !== ".." ) ;
310+ expect ( entries ) . toContain ( "index.ts" ) ;
311+
312+ // Session still works after filesystem ops
313+ const { response } = await vm . prompt ( sessionId , "hello" ) ;
314+ expect ( response . error ) . toBeUndefined ( ) ;
315+
316+ vm . closeSession ( sessionId ) ;
317+ } , 90_000 ) ;
318+
261319 test ( "vm.dispose() closes active sessions before kernel" , async ( ) => {
262320 await createMockSession ( vm ) ;
263321
0 commit comments